package validadores;


import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;


@FacesValidator("validadores.cedulaValidator")
public class CedulaValidator implements Validator {

	public static  final int num_provincias = 24; 
	private static int[] coeficientes = {4,3,2,7,6,5,4,3,2};
	private static int constante = 11;
	
	
	@Override
	public void validate(FacesContext context, UIComponent component,
			Object value) throws ValidatorException {
		
		
		if(!validadorDeCedula(value.toString())){
    			FacesMessage msg = new FacesMessage("Identificador Invalido", 
    					"Identificador Invalido");
				msg.setSeverity(FacesMessage.SEVERITY_ERROR);
				throw new ValidatorException(msg);	
		}
	}

   	

	public boolean validadorDeCedula(String cedula) {
		boolean cedulaCorrecta = false;

		try {

			if (cedula.length() == 10) // ConstantesApp.LongitudCedula
			{
				int tercerDigito = Integer.parseInt(cedula.substring(2, 3));
				if (tercerDigito < 6) {
					// Coeficientes de validación cédula
					// El decimo digito se lo considera dígito verificador
					int[] coefValCedula = { 2, 1, 2, 1, 2, 1, 2, 1, 2 };
					int verificador = Integer.parseInt(cedula.substring(9, 10));
					int suma = 0;
					int digito = 0;
					for (int i = 0; i < (cedula.length() - 1); i++) {
						digito = Integer.parseInt(cedula.substring(i, i + 1))
								* coefValCedula[i];
						suma += ((digito % 10) + (digito / 10));
					}

					if ((suma % 10 == 0) && (suma % 10 == verificador)) {
						cedulaCorrecta = true;
					} else if ((10 - (suma % 10)) == verificador) {
						cedulaCorrecta = true;
					} else {
						cedulaCorrecta = false;
					}
				} else {
					cedulaCorrecta = false;
				}
			} else {
				cedulaCorrecta = false;
			}
		} catch (NumberFormatException nfe) {
			cedulaCorrecta = false;
		} catch (Exception err) {
			System.out
					.println("Una excepcion ocurrio en el proceso de validadcion");
			cedulaCorrecta = false;
		}
  /*
		if (!cedulaCorrecta) {
			System.out.println("La Cédula ingresada es Incorrecta");
		}
	*/
		return cedulaCorrecta;
	}
	
	
	/**
	 * Valida de RUC segunda opcion 
	 * @param ruc
	 * @return true si el ruc es correcto faslse si es incorrecto
	 */
	
	public static Boolean validaRucEP(String ruc){
		int prov = Integer.parseInt(ruc.substring(0, 2));
		boolean val = false;

        if (!((prov > 0) && (prov <= num_provincias))) {
            return val;
        }
		
		Integer v1,v2,v3,v4,v5,v6,v7,v8,v9;
		Integer sumatoria;
		Integer modulo;
		Integer digito;
		Integer sustraendo;
		 int[] d = new int[ruc.length()];
		 
		for (int i = 0; i < d.length; i++) {
            d[i] = Integer.parseInt(ruc.charAt(i) + "");
        }
		
		v1 = d[0]* 3;
		v2 = d[1]* 2;
		v3 = d[2]* 7;
		v4 = d[3]* 6;
		v5 = d[4]* 5;
		v6 = d[5]* 4;
		v7 = d[6]* 3;
		v8 = d[7]* 2;
		v9 = d[8];
				
		sumatoria = v1+v2+v3+v4+v5+v6+v7+v8;
		modulo = sumatoria % 11;
		sustraendo = modulo * 11;
		digito = 11-(sumatoria - sustraendo);
		System.out.println("Digito RUC       --> "+digito);
		System.out.println("Digito Calculado --> "+v9);
		
		if(digito == v9){
			val = true;
		}else
			val = false;
		return val;
	}
	
/**
 * Validar RUC de Personas Naturales
 * @param ruc
 * @return true si el ruc es correcto o false si es Incorrecto
 */
	public static Boolean validacionRUC(String ruc){
        //verifica que los dos primeros dígitos correspondan a un valor entre 1 y NUMERO_DE_PROVINCIAS
        int prov = Integer.parseInt(ruc.substring(0, 2));

        if (!((prov > 0) && (prov <= num_provincias))) {
        	System.out.println("Error: ruc ingresada mal");
            return false;
        }

        //verifica que el último dígito de la cédula sea válido
        int[] d = new int[10];
        int suma = 0;

        //Asignamos el string a un array
        for (int i = 0; i < d.length; i++) {
            d[i] = Integer.parseInt(ruc.charAt(i) + "");
        }
        
        for (int i=0; i< d.length - 1; i++) {
        	d[i] = d[i] * coeficientes[i];
        	suma += d[i];
        	//System.out.println("Vector d en " + i + " es " + d[i]);
        }
        
        System.out.println("Suma es: " + suma);
        
        int aux, resp;
        
        aux = suma % constante;
        resp = constante - aux;
        
        resp = (resp == 10) ? 0 : resp;
        
        System.out.println("Aux: " + aux);
        System.out.println("Resp " + resp);
        System.out.println("d[9] " + d[9]);
        
        if (resp == d[9]) {
        	return true;
        }
        else
        	return false;
	}
	
	/**
	 * 
	 * @param numero
	 * @return
	 */
	public static boolean validarDocumento(String numero) {
		boolean valor = true;
		try {
			int suma = 0;
			int residuo = 0;
			boolean privada = false;
			boolean publica = false;
			boolean natural = false;
			int numeroProvincias = 22;
			int digitoVerificador = 0;
			int modulo = 11;

			int d1, d2, d3, d4, d5, d6, d7, d8, d9, d10;
			int p1, p2, p3, p4, p5, p6, p7, p8, p9;

			d1 = d2 = d3 = d4 = d5 = d6 = d7 = d8 = d9 = d10 = 0;
			p1 = p2 = p3 = p4 = p5 = p6 = p7 = p8 = p9 = 0;

			if (numero.length() < 10) {
				valor = false;
			}

			// Los primeros dos digitos corresponden al codigo de la provincia
			int provincia = Integer.parseInt(numero.substring(0, 2));

			if (provincia <= 0 || provincia > numeroProvincias) {
				valor = false;
			}

			// Aqui almacenamos los digitos de la cedula en variables.
			d1 = Integer.parseInt(numero.substring(0, 1));
			d2 = Integer.parseInt(numero.substring(1, 2));
			d3 = Integer.parseInt(numero.substring(2, 3));
			d4 = Integer.parseInt(numero.substring(3, 4));
			d5 = Integer.parseInt(numero.substring(4, 5));
			d6 = Integer.parseInt(numero.substring(5, 6));
			d7 = Integer.parseInt(numero.substring(6, 7));
			d8 = Integer.parseInt(numero.substring(7, 8));
			d9 = Integer.parseInt(numero.substring(8, 9));
			d10 = Integer.parseInt(numero.substring(9, 10));

			// El tercer digito es:
			// 9 para sociedades privadas y extranjeros
			// 6 para sociedades publicas
			// menor que 6 (0,1,2,3,4,5) para personas naturales
			if (d3 == 7 || d3 == 8) {
				numero= "";
				valor = false;
			}

			// Solo para personas naturales (modulo 10)
			if (d3 < 6) {
				natural = true;
				modulo = 10;
				p1 = d1 * 2;
				if (p1 >= 10)
					p1 -= 9;
				p2 = d2 * 1;
				if (p2 >= 10)
					p2 -= 9;
				p3 = d3 * 2;
				if (p3 >= 10)
					p3 -= 9;
				p4 = d4 * 1;
				if (p4 >= 10)
					p4 -= 9;
				p5 = d5 * 2;
				if (p5 >= 10)
					p5 -= 9;
				p6 = d6 * 1;
				if (p6 >= 10)
					p6 -= 9;
				p7 = d7 * 2;
				if (p7 >= 10)
					p7 -= 9;
				p8 = d8 * 1;
				if (p8 >= 10)
					p8 -= 9;
				p9 = d9 * 2;
				if (p9 >= 10)
					p9 -= 9;
			}

			// Solo para sociedades publicas (modulo 11)
			// Aqui el digito verficador esta en la posicion 9, en las otras 2
			// en la pos. 10
			if (d3 == 6) {
				publica = true;
				p1 = d1 * 3;
				p2 = d2 * 2;
				p3 = d3 * 7;
				p4 = d4 * 6;
				p5 = d5 * 5;
				p6 = d6 * 4;
				p7 = d7 * 3;
				p8 = d8 * 2;
				p9 = 0;
			}

			/* Solo para entidades privadas (modulo 11) */
			if (d3 == 9) {
				privada = true;
				p1 = d1 * 4;
				p2 = d2 * 3;
				p3 = d3 * 2;
				p4 = d4 * 7;
				p5 = d5 * 6;
				p6 = d6 * 5;
				p7 = d7 * 4;
				p8 = d8 * 3;
				p9 = d9 * 2;
			}

			suma = p1 + p2 + p3 + p4 + p5 + p6 + p7 + p8 + p9;
			residuo = suma % modulo;

			// Si residuo=0, dig.ver.=0, caso contrario 10 - residuo
			digitoVerificador = residuo == 0 ? 0 : modulo - residuo;
			int longitud = numero.length(); // Longitud del string

			// ahora comparamos el elemento de la posicion 10 con el dig. ver.
			if (publica == true) {
				if (digitoVerificador != d9) {
					valor = false;
				}
				/* El ruc de las empresas del sector publico terminan con 0001 */
				if (!numero.substring(9, longitud).equals("0001")) {
					valor = false;
				}
			}

			if (privada == true) {
				if (digitoVerificador != d10) {
					valor = false;
				}
				if (!numero.substring(10, longitud).equals("001")) {
					valor = false;
				}
			}

			if (natural == true) {
				if (digitoVerificador != d10) {
					numero = "";
					valor = false;
				}
				if (numero.length() > 10
						&& !numero.substring(10, longitud).equals(
								"001")) {
			       numero ="";
		        	  valor = false;
				}
			}
		} catch (Exception e) {
			numero = "";
			valor = false;
		}
		return valor;
	}
	
}

